package util.form.pregunta;

import java.util.ArrayList;
import java.util.List;

import util.form.respuesta.InputInvalidoException;

public class PreguntaImpl<R extends Restriccion>
implements Pregunta
{
	private final String MENSAJE_REQUERIDO = "Valor requerido";
	private String mensajeRequerido;
	
	private String nombre;
	private String etiquetaCorta;
	//private String etiqueta;	
	private boolean soloLectura = false;
	private boolean requerido = false;
	private boolean omitible = false;
	
	private R restriccion;//constraint
	private final List<R> restriccionesInternas = new ArrayList<R>();//constraints
	
	//@Override
	public PreguntaImpl<R> setSoloLectura(boolean soloLectura) {
		this.soloLectura = soloLectura;
		return this;
	}
	
	@Override
	public boolean isSoloLectura() {
		return soloLectura;
	}
	
	/*
	public String getEtiqueta() {
		return etiqueta;
	}

	public PreguntaImpl setEtiqueta(String etiqueta) {
		this.etiqueta = etiqueta;
		return this;
	}
	*/
	
	public boolean isRequerido() {
		return requerido;
	}

	public PreguntaImpl<R> setRequerido(boolean requerido) {
		this.requerido = requerido;
		return this;
	}

	public final String getNombre() {
		return nombre;
	}

	public PreguntaImpl<R> setNombre(String nombre)  throws Exception {
		this.nombre = nombre;
		return this;
	}

	public String getEtiquetaCorta() {
		if(etiquetaCorta!=null)
			return etiquetaCorta;
		return nombre==null?"":nombre;
	}

	public PreguntaImpl<R> setEtiquetaCorta(String etiquetaCorta) {
		this.etiquetaCorta = etiquetaCorta;
		return this;
	}
	
	public PreguntaImpl<R> setRestriccion(R restriccion) {
		this.restriccion = restriccion;
		return this;
	}

	public R getRestriccion() {
		return restriccion;
	}

	/*
	protected final List<R> getRestriccionesInternas() {
		return restriccionesInternas;
	}
	*/
	
	protected final void agregarRestriccionInterna(R restriccion) {
		this.restriccionesInternas.add(restriccion);
	}
	
	//@Override
	public void validarRestricciones(String valores[]) throws Exception {
		for(R r : restriccionesInternas) {
			validarRestriccion(r,valores);
		}		
		validarRestriccion(this.getRestriccion(),valores);		
	}
	
	private void validarRestriccion(R r, String valores[]) throws Exception {
		if(r!=null) {
			String msj = r.validar(valores);
			if(msj!=null)
				throw new InputInvalidoException(getPrefijo()+msj);
		}
	}
	
	public String getPrefijo() {
		String et = getEtiquetaCorta();
		return (et==null || et.trim().isEmpty()?"":et+": ");
	}
	
	public String getMensajeRequerido() {
		if(mensajeRequerido!=null)
			return mensajeRequerido;
		return getPrefijo()+MENSAJE_REQUERIDO;
	}

	public void setMensajeRequerido(String mensajeRequerido) {
		this.mensajeRequerido = mensajeRequerido;
	}

	public boolean isOmitible() {
		return omitible;
	}

	public void setOmitible(boolean omitible) {
		this.omitible = omitible;
	}
	
	
}
